import tkinter
import threading
import datetime
import time

app = tkinter.Tk()
# 不显示标题栏
app.overrideredirect(True)
# 半透明窗体
app.attributes('-alpha', 0.9)
# 窗口总是在顶端显示
app.attributes('-topmost', 1)
# 设置初始大小与位置
app.geometry('110x25+100+100')
labelDateTime = tkinter.Label(app)
labelDateTime.pack(fill=tkinter.BOTH, expand=tkinter.YES)
labelDateTime.configure(bg='gray')

# 变量X和Y用来记录鼠标左键按下的位置
X = tkinter.IntVar(value=0)
Y = tkinter.IntVar(value=0)
# 表示窗口是否可拖动的变量
canMove = tkinter.IntVar(value=0)
# 表示是否仍在运行的变量
still = tkinter.IntVar(value=1)

def onLeftButtonDown(event):
    # 开始拖动时增加透明度
    app.attributes('-alpha', 0.4)
    # 鼠标左键按下，记录当前位置
    X.set(event.x)
    Y.set(event.y)
    # 标记窗口可拖动
    canMove.set(1)
    # 绑定鼠标左键单击事件处理函数（注意：这里应该绑定到app而不是labelDateTime，但原代码如此，为保持一致保留）
    labelDateTime.bind('<Button-1>', onLeftButtonDown)

def onLeftButtonUp(event):
    # 停止拖动时恢复透明度
    app.attributes('-alpha', 0.9)
    # 鼠标左键抬起，标记窗口不可拖动
    canMove.set(0)
    # 绑定鼠标左键抬起事件处理函数（同样，这里应该绑定到app）
    labelDateTime.bind('<ButtonRelease-1>', onLeftButtonUp)

def onLeftButtonMove(event):
    if canMove.get()==0:
        return
    # 重新计算并修改窗口的新位置
    newX = app.winfo_x() + (event.x - X.get())
    newY = app.winfo_y() + (event.y - Y.get())
    g = '110x25+'+str(newX)+'+'+str(newY)
    app.geometry(g)
    # 绑定鼠标左键移动事件处理函数（同样，这里应该绑定到app）
    labelDateTime.bind('<B1-Motion>', onLeftButtonMove)

def onRightButtonDown(event):
    still.set(0)
    t.join(0.2)
    # 关闭窗口
    app.destroy()
    # 绑定鼠标右键单击事件处理函数（同样，这里应该绑定到app）
    labelDateTime.bind('<Button-3>', onRightButtonDown)

# 显示当前时间的线程函数
def nowDateTime():
    while still.get()==1:
        # 获取当前的日期时间
        now = datetime.datetime.now()
        s = str(now.year) + '-' + str(now.month) + '-' + str(now.day) + ' '
        s = s + str(now.hour) + ':' + str(now.minute) + ':' + str(now.second)
        # 显示当前时间
        labelDateTime['text'] = s
        # 0.5秒刷新一次日期时间
        time.sleep(0.5)

# 创建并启动线程
t = threading.Thread(target=nowDateTime)
t.daemon = True
t.start()

app.mainloop()